
/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package servlets;

import java.io.IOException;
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import src.ListaMensajes;
import src.ListaUsuarios;
import src.Usuario;
import src.Permisos;
import src.exceptions.eNoPermission;
import src.exceptions.eNoUser;

/**
 *
 * @author pabloavila
 */
public class Controller extends HttpServlet {

    // Atributos
    /**
     * El sevlet Controller se encargara de controlar
     * el acceso de usuarios. Para ello dispondra de la
     * lista de usuarios como atributo.
     * Además tiene que controlar las variables de sesion
     * [esto va a dar algo de guerra]
     */
    private ListaUsuarios lu;
    private Usuario aux;
    private ListaMensajes lm;
    //Apaño
    
    
    /** 
     * Processes requests for both HTTP <code>GET</code> and <code>POST</code> methods.
     * @param request servlet request
     * @param response servlet response
     * @throws ServletException if a servlet-specific error occurs
     * @throws IOException if an I/O error occurs
     */
    protected void processRequest(HttpServletRequest request, HttpServletResponse response)
    throws ServletException, IOException {
        //response.setContentType("text/html;charset=UTF-8");
        //PrintWriter out = response.getWriter();
        String page;
        // Usamos la session actual IFF existe
        HttpSession session = request.getSession(false);
        try {

            
            
            lu = ListaUsuarios.getListaUsuarios();
            lm = ListaMensajes.getListaMensajes();

            // Pagina a la que haremos forward
            page = "/Dispatcher";

            // Si no hay una sesion la creamos
            if (session == null) session = request.getSession(true);

            // Los parametros de la session seran:
            // 1) Lista de Usuarios
            session.setAttribute("ses_list", lu);
            // 2) Lista de Mensajes
            session.setAttribute("ses_msg", lm);
            // 3) Usuario autorizado: "ses_usr"
            // 4) Variable booleana que dice que se ha "logueado": "ses_ok"
            // 5) La accion que se pide
            session.setAttribute("action","");

            // La lista de mensajes tambien se pasara
            //request.setAttribute("req_msg", lm);            

            /**
             * Vamos a intentar coger los parametros             * 
             */
            String formname = request.getParameter("name");
            //String formpass = request.getParameter("pass");
            String formpermission = request.getParameter("usertype");
            
            Permisos p;
            if(formpermission.equals("GUEST")) p = Permisos.GUEST;
            else if (formpermission.equals("USER")) p = Permisos.USER;
            else if (formpermission.equals("ADMIN")) p = Permisos.ADMIN;
            else p = Permisos.GUEST;

            // Por si se cuela algo
            session.setAttribute("ses_ok",false);
            session.setAttribute("ses_activa",false);

            // Ahora vamos a probar a ver si funciona la búsqueda
            aux = lu.getUsuario(formname);            
            if (aux != null) {
                // Miramos si valen los permisos
                session.setAttribute("ses_usr",aux);
                session.setAttribute("ses_activa",true);
                if (aux.getPermisos().equals(p)){                                       
                    session.setAttribute("ses_ok", true);
                    session.setAttribute("ses_notify","Bienvenido " + aux.getNombre());
                    session.setAttribute("ses_sign", true);
                }
                else {
                    // El usuario existe pero los permisos no son validos
                    // Lo rechazamos
                    session.setAttribute("ses_ok",false);
                    throw new eNoPermission("Error: El usuario no tiene los permisos dichos: entrara como Invitado");
                }                
            }
            else throw new eNoUser("Error: El usuario " + formname + " no existe");
                       
            // dispatch control to view
            dispatch(request, response, page);


            
        } catch(eNoPermission e) {
            // Pillar la excepcion
            page = "/Viewer";
            // Pasarle los valores por request a viewer
            session.setAttribute("ses_notify",e.toString());
            session.setAttribute("ses_sign",false);           
            dispatch(request,response,page);
        } catch(eNoUser e){
            page = "/index.jsp";
            // Pasarle los valores por request a viewer
            session.setAttribute("ses_notify",e.toString());
            session.setAttribute("ses_sign",false);
            dispatch(request,response,page);
        } catch(Exception e){
            page = "/index.jsp";
            // Pasarle los valores por request a viewer
            session.setAttribute("ses_notify",e.toString());
            session.setAttribute("ses_sign",false);
            dispatch(request,response,page);

        }
    } 

    protected void dispatch(HttpServletRequest request,
        HttpServletResponse response,String page)
        throws  javax.servlet.ServletException, java.io.IOException {
        RequestDispatcher dispatcher = getServletContext().getRequestDispatcher(page);
        dispatcher.forward(request, response);
    }


    // <editor-fold defaultstate="collapsed" desc="HttpServlet methods. Click on the + sign on the left to edit the code.">
    /** 
     * Handles the HTTP <code>GET</code> method.
     * @param request servlet request
     * @param response servlet response
     * @throws ServletException if a servlet-specific error occurs
     * @throws IOException if an I/O error occurs
     */
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response)
    throws ServletException, IOException {
        processRequest(request, response);
    } 

    /** 
     * Handles the HTTP <code>POST</code> method.
     * @param request servlet request
     * @param response servlet response
     * @throws ServletException if a servlet-specific error occurs
     * @throws IOException if an I/O error occurs
     */
    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response)
    throws ServletException, IOException {
        processRequest(request, response);
    }

    /** 
     * Returns a short description of the servlet.
     * @return a String containing servlet description
     */
    @Override
    public String getServletInfo() {
        return "Manages the user authentication";
    }// </editor-fold>

}
